//package com.hpt.newconsumer.server.http
//
//import android.graphics.BitmapFactory
//import android.os.SystemClock
//import android.util.Log
//import com.blankj.utilcode.util.EncryptUtils
//import com.blankj.utilcode.util.TimeUtils
//import com.blankj.utilcode.util.ToastUtils
//import com.google.gson.Gson
//import com.hpt.newconsumer.App
//import com.leessy.r229.config.Config
//import com.hpt.newconsumer.constants.Constants
//import com.hpt.newconsumer.event.Event.postEvent
//import com.hpt.newconsumer.event.EventKey
//import com.hpt.newconsumer.greendao.bean.IdentifyRecordBean
//import com.hpt.newconsumer.greendao.dao.IdentifyRecordBeanDao
//import com.hpt.newconsumer.greendao.dao.OutlineRecordBeanDao
//import com.hpt.newconsumer.greendao.db.DbManage
//import com.hpt.newconsumer.greendao.db.save
//import com.hpt.newconsumer.kt.*
//import com.leessy.r229.server.http.databean.OfflineParamsBean
//import com.hpt.newconsumer.server.mqtt.MqttServer
//import com.hpt.newconsumer.utils.DevicesBootUtil
//import com.hpt.newconsumer.utils.LogFile
//import com.raysko.r229.server.http.HttpRetrofit
//import io.reactivex.rxjava3.core.Observable
//import io.reactivex.rxjava3.disposables.Disposable
//import io.reactivex.rxjava3.functions.BiFunction
//import io.reactivex.rxjava3.schedulers.Schedulers
//import okhttp3.MediaType
//import okhttp3.RequestBody
//import java.text.SimpleDateFormat
//import java.util.*
//import java.util.concurrent.TimeUnit
//
///**
// * @author : Created by liucheng. on 2021/01/04
// * @description : http timed pull task
// *
// * 1.心跳
// * 2.定时检测离线消费记录,并上传
// * 3.定时消费记录图片,并上传
// *
// * 注意事项:所有上传服务的人员ID, 转16进制,不够8位前面补0
// */
//object HttpServer {
//    private const val TAG = "HttpServer"
//    private val mediaType = MediaType.parse("application/json")
//    private val gson = Gson()
//    private val period = 15L
//    private var disposable: Disposable? = null
//    private val time_fm = SimpleDateFormat("yyyyMMddHHmmss")/*解析心跳时间用过*/
//    private val fm = SimpleDateFormat("yyMMddHHmmss")/*上传离线记录专用*/
//    private val shutdownTime = SimpleDateFormat("HHmm")/*关机时间格式*/
//
//
//    private var isCmdShutdowmed = false//关机指令只处理一次
//    private var isUploadImage = true//是否需要上传图片，默认上传，服务器心跳返回值
//    var rebootDay = TimeUtils.millis2String(System.currentTimeMillis(), "dd")
//
//    fun startTask() {
//        disposable?.dispose()
//        disposable = Observable.interval(2, period, TimeUnit.SECONDS, Schedulers.io())
//            .map {
//                if (it > 0 && it % 15 == 0L) checkReboot()
//                it
//            }
//            .filter { Config.isNetwork() && isEnabled() }//需要配置了http地址才执行 -- 默认地址不用做任何操作
//            .map {
//                getCurrentTime()
//                getConfig()
//                if (it % 2 == 0L && Config.isServerConnected) {
//                    checkConsumerRecord()
//                }
//                if (isUploadImage && it % 20 == 0L && Config.isServerConnected) {
//                    checkIdentifyRecord()
//                }
//            }
//            .subscribe({}, {
//                Log.d(TAG, "startTask: 异常 $it")
//                startTask()
//            })
//    }
//
//
//    //检测重启
//    fun checkReboot() {
//        rebootDay = TimeUtils.millis2String(System.currentTimeMillis(), "dd")//必须要加上去
//        if (!Config.autoReboot || Config.autoRebootLastDay == rebootDay) {
//            return
//        }
//        val hh = TimeUtils.millis2String(System.currentTimeMillis(), "HH")?.toIntOrNull() ?: return
//        if (hh == Config.autoRebootTime) {
//            Log.d(TAG, "定时重启设备:  autoRebootLastDay=${Config.autoRebootLastDay}  hh=$hh")
//            Config.autoRebootLastDay = rebootDay
//            Config.sync()
//            LogFile.logRecord("定时重启设备")
//            ToastUtils.showLong("定时重启设备")
//            Observable.timer(3, TimeUnit.SECONDS).subscribe {
//                DevicesBootUtil.reboot(App.instance)
//            }
//        }
//    }
//
//    /*获取服务器时间,也是心跳接口,以此判断是否与服务器连接正常*/
//    private fun getCurrentTime() {
//        val body = RequestBody.create(mediaType, gson.toJson(hashMapOf<String, String>().apply {
//            put("ICCID", "${Config.DEV_IMSI}")
//            put("ICCID2", "${Config.DEV_ICCID}")
//        }))
//        HttpRetrofit.apiService().currentTime(body)
//            .subscribeOnNew()
//            .doFinally { EventKey.SERVER_CONNET_CHANGE.postEvent() }
//            .subscribe({
//                Config.isServerConnected = it.isSuccess()
//                Config.isLittleEndian = it.IsLittleEndian
//                Config.autoTrade = it.autoOfflineTrade
//                try {
//                    LoadFaceTask.isBatchRet = it.BatchUpdate == 1
//                    if (it.TimePrice != null && (Config.consumptionType == 0 || Config.consumptionType == 2)) {
//                        val fl = it.TimePrice?.toFloatOrNull() ?: 0F
//                        val fixAmount = Config.fixAmount?.toFloatOrNull() ?: 0F
//                        if (fl > 0 && fl != fixAmount) {
//                            Config.fixAmount = "$fl"
//                            EventKey.FACE_RECOGNITION_CONFIG_CHANGE.postEvent()
//                        }
//                    }
//                    //心跳同步时间
//                    if (it.Time != null && it.Time!!.length > 14) {//测试 202107271716212
//                        val strings: String = it.Time!!.substring(0, it.Time!!.length - 1)
//                        val l: Long =
//                            TimeUtils.string2Millis(strings, time_fm)
//                        if (l > 0 && kotlin.math.abs(System.currentTimeMillis() - l) > 10000) {//差额大于10秒更新
//                            SystemClock.setCurrentTimeMillis(l)
//                            System.setProperty("user.timezone", "Asia/Shanghai")
//                        }
//                    }
//                    //心跳同步mqtt配置
//                    if (it.mqttConfig != null) {
//                        if (it.mqttConfig!!.mqttHost.isNullOrBlank()) {
//                            Config.mqttHost = ""
//                            Config.mqttUsername = ""
//                            Config.mqttPassword = ""
//                            Config.mqttSubscribeTopic = ""
//                            Config.mqttClientId = ""
//                            Config.mqttPublishTopic = ""
//                        } else {
//                            Config.mqttHost = "${it.mqttConfig?.mqttHost}"
//                            Config.mqttUsername = "${it.mqttConfig?.mqttUsername}"
//                            Config.mqttPassword = "${it.mqttConfig?.mqttPassword}"
//                            Config.mqttSubscribeTopic = "${it.mqttConfig?.mqttSubscribeTopic}"
//                            Config.mqttClientId = "${it.mqttConfig?.mqttClientId}"
//                            Config.mqttPublishTopic = "${it.mqttConfig?.mqttPublishTopic}"
//                            MqttServer.instance.initServer(App.instance)//已经初始化过的情况，不会执行
//                        }
//                    }
//                    //心跳同步重启指令、图片上传指令
//                    if (!isCmdShutdowmed && it.CloseTime != null) {
//                        val ti = it.CloseTime?.toIntOrNull() ?: 0
//                        if (ti > 0) {
//                            val devt = Integer.valueOf(TimeUtils.getNowString(shutdownTime))
//                            if (devt >= ti && (devt - ti < 100)) {//设备时间大于关机时间，并且时间差距不超过一个小时
//                                EventKey.REBOOT_STATUS_CHANGE.postEvent()
//                                isCmdShutdowmed = true
//                            }
//                        }
//                    }
//                    //是否上传图片
//                    isUploadImage = it.UploadImage
//                } catch (e: Exception) {
//                    e.printStackTrace()
//                }
//                Log.d(TAG, "getCurrentTime:${it.isSuccess()} --  ${it.toJsonString()}")
//            }, {
//                Config.isServerConnected = false
//                Log.d(TAG, "getCurrentTime: erro: $it")
//            })
//    }
//
//    var getConfigs = true
//    var getConfigNum = 0//最多尝试次数50
//    fun getConfig() {
//        if (!getConfigs || getConfigNum++ > 30) return
//        HttpRetrofit.apiService().getSetting().subscribeOnIo()
//            .subscribe({
//                getConfigs = false
//                if (it.password.isNullOrBlank() || it.password.length < 6) return@subscribe
//                Config.startSector = it.startSectorIndex
////               固定密码
//                val key = "r46Am&8L"
//                val encryptMD5 = EncryptUtils.encryptMD5(key.toByteArray())
//                val bytes: ByteArray = EncryptUtils.decryptBase64_3DES(
//                    "${it.password}".toByteArray(),
//                    encryptMD5,
//                    "DESede/ECB/NoPadding",
//                    null
//                )
//                val secret = String(bytes).trim()
//                if (secret.length >= 12) {
//                    Config.systemSecretHex = secret.substring(0, 12)
//                }
//                Log.d(TAG, "getConfig: 解析卡密码：$secret  扇区:${Config.startSector}")
//            }, {
//                if ("${it.message}".contains("Not Found") || "${it.message}".contains("404")) {
//                    getConfigNum = 50//服务器不支持此接口不再尝试
//                }
//                Log.d(TAG, "getConfig err: $it")
//            })
//    }
//
//    //判断是否为默认地址,为默认地址证明未配置有效地址,则不启用相关功能
//    fun isEnabled() = !Config.httpHost!!.contains("http://192.168.1.1:123456")
//
//
//    private var offlineNumber = 1/*上传离线记录流水号,成功+1*/
//    private var checkConsumer: Disposable? = null
//
//    /*检查是否有离线消费记录 , 每次上传10条 */
//    private fun checkConsumerRecord() {
//        checkConsumer?.let { if (!it.isDisposed) return }/*任务还在执行 ,不能打断*/
//        val data = DbManage.outlineRecordBeanDao().queryBuilder()
//            .where(OutlineRecordBeanDao.Properties.IsUpload.eq(false)).list()
//        if (data.isEmpty()) return
//        data.averageAssignFixLength(10)
//        checkConsumer =
//            Observable.fromIterable(data.averageAssignFixLength(10))/*拆分成10一组*/
//                .subscribe({ datas ->
//                    val list = datas.map {
//                        OfflineParamsBean.OfflineData().apply {
//                            pid = it.personId//增加通用性字段
//                            payType = it.payType.toString()//增加通用性字段
//                            cardNumber = it.cardNo
//                            Class = "100"/*默认值*/
//                            if (it.payType == Constants.PAY_TYPE_CARD) {
//                                var card = it.cardNo.toLongOrNull() ?: 0
//                                if (!Config.isLittleEndian) {//卡号大小端切换
//                                    card = card.contraryModel()
//                                }
//                                CardNo = String.format(
//                                    "%08x",
//                                    card
//                                )/*人脸核验时 传人员ID ,刷卡时传卡号*/
//                            } else {
//                                CardNo =
//                                    String.format(
//                                        "%08x",
//                                        it.personId.toLongOrNull() ?: 0
//                                    )/*人脸核验时 传人员ID ,刷卡时传卡号*/
//                            }
//                            Money = it.money.toString()
//                            Day_Money = it.dayMoney.toString()
//                            Id = it.deviceId
//                            Serial = it.getId().toString()
//                            Time = TimeUtils.millis2String(it.time, fm)
//                            if (it.payType == Constants.PAY_TYPE_FACE) {
//                                imageID = "${it.time}${Constants.SN}"/*图片ID*/
//                            }
//                            Order = it.reserved1
//                        }
//                    }
//                    val body = RequestBody.create(mediaType, gson.toJson(OfflineParamsBean().apply {
//                        Count = datas.size.toString()
//                        Number = offlineNumber.toString()
//                        Data = list
//                    }))
//
//                    try {
//                        val res = HttpRetrofit.apiService().offlinesCall(body).execute()?.body()
//                        if (res != null && res.isSuccess()) {
//                            DbManage.outlineRecordBeanDao().saveInTx(datas.map {
//                                it.apply { isUpload = true }/*修改数据库状态*/
//                            })
//                            offlineNumber++
//                        }
//                    } catch (e: Exception) {
//                        Log.d(TAG, "checkConsumerRecord err : ${e}")
//                        e.printStackTrace()
//                    }
//                }, { it.printStackTrace() })
//
//    }
//
//    var uploadIdentifyRecord: Disposable? = null
//
//    /*检查记录是否有未上传的图片*/
//    private fun checkIdentifyRecord() {
//        uploadIdentifyRecord?.let { if (!it.isDisposed) return }/*任务还在执行 ,不能打断*/
//        val list = DbManage.identifyRecordBeanDao().queryBuilder()
//            .where(
//                IdentifyRecordBeanDao.Properties.IsConsumer.eq(true),
//                IdentifyRecordBeanDao.Properties.IsUpload.eq(false)
//            ).list()
//        if (list.isNotEmpty()) {
//            uploadIdentifyRecord = Observable.fromIterable(list)
//                .zipWith(Observable.intervalRange(0, list.size.toLong(), 0, 5, TimeUnit.SECONDS),
//                    BiFunction<IdentifyRecordBean, Long, IdentifyRecordBean> { t1, t2 -> t1 })
//                .observeOnIo()
//                .map {
//                    uploadRecord(it)
//                }
//                .debounce(10, TimeUnit.SECONDS)/*10秒没有数据超时就结束了*/
//                .take(1)
//                .subscribe({}, {})
//        }
//    }
//
//    /*上传消费机记录<图片>*/
//    fun uploadRecord(record: IdentifyRecordBean) {
//        if (!record.isConsumer || !Config.isNetwork() || !isUploadImage) {
//            return
//        }
//        try {
//            val base64 = BitmapFactory.decodeFile(record.path).toBase64()
//            if (base64 == null) {
//                DbManage.save(record.apply { isUpload = true }) /*图片无法加载*/
//                return
//            }
//            val body = RequestBody.create(mediaType, gson.toJson(hashMapOf<String, String>().apply {
//                put("imageBase64", base64)
//                put("imageID", "${record.time}${Constants.SN}")
//            }))
//            HttpRetrofit.apiService().uploadReordimg(body).observeOnIo()
//                .subscribe({
//                    Log.d(TAG, "uploadRecord: ${it}")
//                    DbManage.save(record.apply { isUpload = true }) /*图片上传成功*/
//                }, {
//                    Log.d(TAG, "uploadRecord: err $it")
//                })
//
//
//        } catch (e: Exception) {
//        }
//    }
//
//}